﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;

namespace CityGames
{
    public partial class FormTarifas : Form
    {
        static private Tarifa enTarifa = new Tarifa(); //static para que no cree mas instancias de enTarifas
        
        static private Tarifa enTarifaClasico = new Tarifa();
        static private Tarifa enTarifaEstreno = new Tarifa();
        static private Tarifa enTarifaNormal = new Tarifa();
        static private Tarifa enTarifaTop = new Tarifa();
        
        private DataSet dsTarifas;
        FormContenedor contenedor;

        private ErrorProvider epClasicoPrecio;
        private ErrorProvider epClasicoRecargo;
        private ErrorProvider epEstrenoPrecio;
        private ErrorProvider epEstrenoRecargo;
        private ErrorProvider epNormalPrecio;
        private ErrorProvider epNormalRecargo;
        private ErrorProvider epTopPrecio;
        private ErrorProvider epTopRecargo;


        public FormTarifas()
        {
            InitializeComponent();
        }

        private void FormTarifas_Load(object sender, EventArgs e)
        {
            try
            {
                contenedor = (FormContenedor)MdiParent; //Cast para que contenedor apunte al formulario contenedor que es el padre
                dsTarifas = enTarifa.ObtenerTarifasDataSet();

                epClasicoPrecio = new ErrorProvider();
                epClasicoPrecio.SetIconAlignment(tbPrecioClasico, ErrorIconAlignment.MiddleRight);
                epClasicoPrecio.SetIconPadding(tbPrecioClasico, 15);
                epClasicoPrecio.BlinkStyle = ErrorBlinkStyle.BlinkIfDifferentError;

                epClasicoRecargo = new ErrorProvider();
                epClasicoRecargo.SetIconAlignment(tbRecargoClasico, ErrorIconAlignment.MiddleRight);
                epClasicoRecargo.SetIconPadding(tbRecargoClasico, 15);
                epClasicoRecargo.BlinkStyle = ErrorBlinkStyle.BlinkIfDifferentError;

                epEstrenoPrecio = new ErrorProvider();
                epEstrenoPrecio.SetIconAlignment(tbPrecioEstreno, ErrorIconAlignment.MiddleRight);
                epEstrenoPrecio.SetIconPadding(tbPrecioEstreno, 15);
                epEstrenoPrecio.BlinkStyle = ErrorBlinkStyle.BlinkIfDifferentError;

                epEstrenoRecargo = new ErrorProvider();
                epEstrenoRecargo.SetIconAlignment(tbRecargoEstreno, ErrorIconAlignment.MiddleRight);
                epEstrenoRecargo.SetIconPadding(tbRecargoEstreno, 15);
                epEstrenoRecargo.BlinkStyle = ErrorBlinkStyle.BlinkIfDifferentError;

                epNormalPrecio = new ErrorProvider();
                epNormalPrecio.SetIconAlignment(tbPrecioNormal, ErrorIconAlignment.MiddleRight);
                epNormalPrecio.SetIconPadding(tbPrecioNormal, 15);
                epNormalPrecio.BlinkStyle = ErrorBlinkStyle.BlinkIfDifferentError;

                epNormalRecargo = new ErrorProvider();
                epNormalRecargo.SetIconAlignment(tbRecargoNormal, ErrorIconAlignment.MiddleRight);
                epNormalRecargo.SetIconPadding(tbRecargoNormal, 15);
                epNormalRecargo.BlinkStyle = ErrorBlinkStyle.BlinkIfDifferentError;

                epTopPrecio = new ErrorProvider();
                epTopPrecio.SetIconAlignment(tbPrecioTop, ErrorIconAlignment.MiddleRight);
                epTopPrecio.SetIconPadding(tbPrecioTop, 15);
                epTopPrecio.BlinkStyle = ErrorBlinkStyle.BlinkIfDifferentError;

                epTopRecargo = new ErrorProvider();
                epTopRecargo.SetIconAlignment(tbRecargoTop, ErrorIconAlignment.MiddleRight);
                epTopRecargo.SetIconPadding(tbRecargoTop, 15);
                epTopRecargo.BlinkStyle = ErrorBlinkStyle.BlinkIfDifferentError;

                //foreach (DataRow row in dsTarifas.Tables["Tarifas"].Rows) Por ejemplo para llenar un comboBox
                //row almacena en cada iteracion el contenido de las filas

                nudNumDiasClasico.Value = int.Parse(dsTarifas.Tables["Tarifas"].Rows[0]["NumeroDias"].ToString());
                tbPrecioClasico.Text = dsTarifas.Tables["Tarifas"].Rows[0]["Precio"].ToString();
                tbRecargoClasico.Text = dsTarifas.Tables["Tarifas"].Rows[0]["Recargo"].ToString();

                nudNumDiasEstreno.Value = int.Parse(dsTarifas.Tables["Tarifas"].Rows[1]["NumeroDias"].ToString());
                tbPrecioEstreno.Text = dsTarifas.Tables["Tarifas"].Rows[1]["Precio"].ToString();
                tbRecargoEstreno.Text = dsTarifas.Tables["Tarifas"].Rows[1]["Recargo"].ToString();

                nudNumDiasNormal.Value = int.Parse(dsTarifas.Tables["Tarifas"].Rows[2]["numeroDias"].ToString());
                tbPrecioNormal.Text = dsTarifas.Tables["Tarifas"].Rows[3]["Precio"].ToString();
                tbRecargoNormal.Text = dsTarifas.Tables["Tarifas"].Rows[3]["Recargo"].ToString();

                nudNumDiasTop.Value = int.Parse(dsTarifas.Tables["Tarifas"].Rows[3]["numeroDias"].ToString());
                tbPrecioTop.Text = dsTarifas.Tables["Tarifas"].Rows[3]["Precio"].ToString();
                tbRecargoTop.Text = dsTarifas.Tables["Tarifas"].Rows[3]["Recargo"].ToString();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btlimpiar_Click(object sender, EventArgs e)
        {
            nudNumDiasClasico.Value = 1;
            tbPrecioClasico.Text = "";
            tbRecargoClasico.Text = "";

            nudNumDiasEstreno.Value = 1;
            tbPrecioEstreno.Text = "";            
            tbRecargoEstreno.Text = "";

            nudNumDiasNormal.Value = 1;
            tbPrecioNormal.Text = "";
            tbRecargoNormal.Text = ""; 

            nudNumDiasTop.Value = 1;
            tbPrecioTop.Text = "";
            tbRecargoTop.Text = ""; 
        }

        private void btAceptar_Click(object sender, EventArgs e)
        {
            int numDiasClasico = int.Parse(nudNumDiasClasico.Value.ToString());
            string precioClasico = tbPrecioClasico.Text;            
            string recargoClasico = tbRecargoClasico.Text;

            int numDiasEstreno = int.Parse(nudNumDiasEstreno.Value.ToString());
            string precioEstreno = tbPrecioEstreno.Text;            
            string recargoEstreno = tbRecargoEstreno.Text;

            int numDiasNormal = int.Parse(nudNumDiasNormal.Value.ToString());
            string precioNormal = tbPrecioNormal.Text;
            string recargoNormal = tbRecargoNormal.Text;

            int numDiasTop = int.Parse(nudNumDiasTop.Value.ToString());
            string precioTop = tbPrecioTop.Text;            
            string recargoTop = tbRecargoTop.Text;

            string extbCantidadEuros = @"^([0-9]+([','][0-9]{1,2})?){1}$";         
            string errores="";

            Limpiar();

            if (precioClasico != "" && recargoClasico != "" && precioEstreno != "" && recargoEstreno != "" && precioNormal != "" && recargoNormal != "" && precioTop != "" && recargoTop != "")
            {
                bool ok = true;
                try
                {
                    errores = "Se han encontrado los siguientes errores:\n\n";

                    if (Regex.Match(precioClasico, extbCantidadEuros).Success)
                    {
                        epClasicoPrecio.SetError(tbPrecioClasico, null);
                        enTarifaClasico.Precio = decimal.Parse(precioClasico);
                    }
                    else
                    {
                        epClasicoPrecio.SetError(tbPrecioClasico, "Precio Clásico formato incorrecto");
                        errores += "- Precio Clásico formato incorrecto\n";
                        ok = false;
                    }

                    if (Regex.Match(recargoClasico, extbCantidadEuros).Success)
                    {
                        epClasicoRecargo.SetError(tbRecargoClasico, null); 
                        enTarifaClasico.Recargo = decimal.Parse(recargoClasico);
                    }
                    else
                    {
                        epClasicoRecargo.SetError(tbRecargoClasico, "Recargo/Día Clásico formato incorrecto"); 
                        errores += "- Recargo/Día Clásico formato incorrecto\n";
                        ok = false;
                    }

                    if (Regex.Match(precioEstreno, extbCantidadEuros).Success)
                    {
                        epEstrenoPrecio.SetError(tbPrecioEstreno, null); 
                        enTarifaEstreno.Precio = decimal.Parse(precioEstreno);
                    }
                    else
                    {
                        epEstrenoPrecio.SetError(tbPrecioEstreno, "Precio Estreno formato incorrecto"); 
                        errores += "- Precio Estreno formato incorrecto\n";
                        ok = false;
                    }

                    if (Regex.Match(recargoEstreno, extbCantidadEuros).Success)
                    {
                        epEstrenoRecargo.SetError(tbRecargoEstreno, null);
                        enTarifaEstreno.Recargo = decimal.Parse(recargoEstreno);
                    }
                    else
                    {
                        epEstrenoRecargo.SetError(tbRecargoEstreno, "Recargo/Día Estreno formato incorrecto");
                        errores += "- Recargo/Día Estreno formato incorrecto\n";
                        ok = false;
                    }

                    if (Regex.Match(precioNormal, extbCantidadEuros).Success)
                    {
                        epNormalPrecio.SetError(tbPrecioNormal, null);
                        enTarifaNormal.Precio = decimal.Parse(precioNormal);
                    }
                    else
                    {
                        epNormalPrecio.SetError(tbPrecioNormal, "Precio Normal formato incorrecto");
                        errores += "- Precio Normal formato incorrecto\n";
                        ok = false;
                    }

                    if (Regex.Match(recargoNormal, extbCantidadEuros).Success)
                    {
                        epNormalRecargo.SetError(tbRecargoNormal, null);
                        enTarifaNormal.Recargo = decimal.Parse(recargoNormal);
                    }
                    else
                    {
                        epNormalRecargo.SetError(tbRecargoNormal, "Recargo/Día Normal formato incorrecto");
                        errores += "- Recargo/Día Normal formato incorrecto\n";
                        ok = false;
                    }

                    if (Regex.Match(precioTop, extbCantidadEuros).Success)
                    {
                        epTopPrecio.SetError(tbPrecioTop, null);
                        enTarifaTop.Precio = decimal.Parse(precioTop);
                    }
                    else
                    {
                        epTopPrecio.SetError(tbPrecioTop, "Precio Top formato incorrecto");
                        errores += "- Precio Top formato incorrecto\n";
                        ok = false;
                    }

                    if (Regex.Match(recargoTop, extbCantidadEuros).Success)
                    {
                        epTopRecargo.SetError(tbRecargoTop, null);
                        enTarifaTop.Recargo = decimal.Parse(recargoTop);
                    }
                    else
                    {
                        epTopRecargo.SetError(tbRecargoTop, "Recargo/Día Top formato incorrecto");
                        errores += "- Recargo/Día Top formato incorrecto\n";
                        ok = false;
                    }

                    if (!ok)
                    {
                        MessageBox.Show(errores, "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    else
                    {
                        //Si todo esta correcto modifico el dataset.
                        dsTarifas.Tables["Tarifas"].Rows[0]["NumeroDias"] = nudNumDiasClasico.Value;
                        dsTarifas.Tables["Tarifas"].Rows[0]["Precio"] = decimal.Parse(tbPrecioClasico.Text);
                        dsTarifas.Tables["Tarifas"].Rows[0]["Recargo"] = decimal.Parse(tbRecargoClasico.Text);

                        dsTarifas.Tables["Tarifas"].Rows[1]["NumeroDias"] = nudNumDiasEstreno.Value;
                        dsTarifas.Tables["Tarifas"].Rows[1]["Precio"] = decimal.Parse(tbPrecioEstreno.Text);
                        dsTarifas.Tables["Tarifas"].Rows[1]["Recargo"] = decimal.Parse(tbRecargoEstreno.Text);

                        dsTarifas.Tables["Tarifas"].Rows[2]["numeroDias"] = nudNumDiasNormal.Value;
                        dsTarifas.Tables["Tarifas"].Rows[2]["Precio"] = decimal.Parse(tbPrecioNormal.Text);
                        dsTarifas.Tables["Tarifas"].Rows[2]["Recargo"] = decimal.Parse(tbRecargoNormal.Text);

                        dsTarifas.Tables["Tarifas"].Rows[3]["numeroDias"] = nudNumDiasTop.Value;
                        dsTarifas.Tables["Tarifas"].Rows[3]["Precio"] = decimal.Parse(tbPrecioTop.Text);
                        dsTarifas.Tables["Tarifas"].Rows[3]["Recargo"] = decimal.Parse(tbRecargoTop.Text);

                        if (enTarifa.ModificarTarifas(dsTarifas, dsTarifas.Tables[0].TableName))
                        {
                            MessageBox.Show("Tarifa modificada correctamente.", "Correcto", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                        else
                        {
                            MessageBox.Show("No se pudo realizar la modificación", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else
            {
                MessageBox.Show("Rellena todos los campos", "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btCancelar_Click(object sender, EventArgs e)
        {
            contenedor.hijoFormMenuPrincipal.Focus();
        }

        public void Limpiar()
        {

            epClasicoPrecio.SetError(tbPrecioClasico, null);
            epClasicoRecargo.SetError(tbRecargoClasico, null);
            epEstrenoPrecio.SetError(tbPrecioEstreno, null);
            epEstrenoRecargo.SetError(tbRecargoEstreno, null);
            epNormalPrecio.SetError(tbPrecioNormal, null);
            epNormalRecargo.SetError(tbRecargoNormal, null);
            epTopPrecio.SetError(tbPrecioTop, null);
            epTopRecargo.SetError(tbRecargoTop, null);

        }
    }
}
